<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 属性描述符
    // 当我们定义对象的属性时，除了属性的名字，值之外，
    // 还有其它的维度来描述这个属性

    // 可以通过
    // Object.getOwnPropertyDescriptor(对象，属性名)
    // 它的返回值就是一个对象，用来对当前属性进行360全方位的说明
    var obj = {
      a: 1
    }
    console.log(Object.getOwnPropertyDescriptor(obj, 'a'))
    // {
    //   configurable: true // 可配置。
    //   enumerable: true   // 可枚举
    //   value: 1 // 表示当前的属性值
    //   writable: true // 可修改
    // }

    Object.defineProperty(obj, 'b', {
      value: 1,           // 表示当前的属性值
      configurable: false, // 可配置。
      enumerable: true,   // 可枚举
      writable: true,    // 可修改
    })

    Object.defineProperty(obj, 'b', {
      value: 1,           // 表示当前的属性值
      configurable: true, // 可配置。
      enumerable: true,   // 可枚举
      writable: true,    // 可修改
    })

// 如果有如下两种定义变量的方式，
    var aa = 1;
    bb = 1;
// 上面的写法，它们都会成为window对象的属性！
// window.aa, window.bb

// 问,aa,bb有何区别？
// (1) delete window.aa 不可以删除aa属性
//     delete window.bb 可以删除bb属性
console.log(Object.getOwnPropertyDescriptor(window, 'aa')) 
// configurable: false.
console.log(Object.getOwnPropertyDescriptor(window, 'bb'))
// configurable: true.
    

  </script>
</body>
</html>